/*
 * 命令：--push
 * 描述：读取配置文件，遍历仓库，依次执行 lazy-git 快捷命令
 * 
 */

const fs = require('fs-extra')
const path = require('path')
const os = require('os')
const shell = require('shelljs')
const moment = require('moment')
const print = require('../../lib/print')
const utils = require('../../lib/utils')

/*
 * 配置文件
 * 模板：{ paths: [], commitMsg: "", gitLog: bool }
 * - paths: 存储多个git仓库的本地路径
 * - commitMsg: 默认执行 commit 命令附带的文本
 * - saveLog: 是否将 git 日志进行保存，默认保存在当前仓库的 .layGitLog 文件中
 */
let _configInfo = utils.readConfigFile('lazy_git.config.json', {paths: [], commitMsg: '日常提交', aveLog: true})
let logFileName = '.layGitLog'

module.exports = function (command) {
    if (command.push) { // --push
        gitPushCommit()
    } else if (command.pull) { // --pull
        gitPullCommit()
    } else if (command.updateGitignore) { // --updateGitignore
        updateGitignoreFile()
    } else {
        // 没有参数则默认执行一个 help
        shell.exec('fisher-tool lazyGit --help')
    }
}

/*
 * 执行提交最新代码命令
 * - 校验本地是否有改动，有改动进行基本 git 命令
 * - 自定义是否将日志进行保存
 */
function gitPushCommit() {
    try {
        let gitPaths = _configInfo.paths || []
        let commitMsg = _configInfo.commitMsg || '日常提交'
        let saveLog = _configInfo.saveLog
        for (let index in gitPaths) {
            let element = gitPaths[index]
            let ymdhms = moment().format('YYYY-MM-DD HH:MM:SS')

            // git 命令
            shell.cd(element)
            let statusLog = shell.exec('git status -s')
            if (!statusLog.stdout) { // 无改动则执行下个循环
                continue
            }
            let addLog = shell.exec('git add *')
            let commitLog = shell.exec(`git commit -m ${commitMsg}`)
            let pushLog = shell.exec('git push -u origin master')

            // 需要的话就将结果写入日志
            if (saveLog) {
                let logPath = `${element}/${logFileName}`
                let content = `
                \n************ ${ymdhms} ***********
                \n1、执行 git status 命令，输出如下：\n${statusLog}\n
                \n2、执行 git add 命令，输出如下：\n${addLog}\n
                \n3、执行 git commit 命令，输出如下：\n${commitLog}\n
                \n4、执行 git push 命令，输出如下：\n${pushLog}\n
                \n**********************************\n\n
                `
                fs.appendFileSync(logPath, content)
            }
        }
    } catch (error) {
        print.errorLog(error)
    }
}

/*
 * 执行拉取最新代码
 */
function gitPullCommit() {
    try {
        let gitPaths = _configInfo.paths || []
        for (const index in gitPaths) {
            const element = gitPaths[index]
            //
            shell.cd(element)
            shell.exec('git pull')
        }
    } catch (error) {
        print.errorLog(error)
    }
}

/*
 * 更新 .gitignore 文件的流程
 * - 当前路径下必须存在 .git
 * - 必须有 .gitignore 
 */
function updateGitignoreFile() {
    let localPath = process.cwd()

    // 1、判断是否有 .git
    if (!fs.existsSync(path.join(localPath, '.git'))) {
        print.errorLog(`${localPath} 不属于 git 管理`)
        return
    }
    // 2、判断是否有 .gitignore
    if (!fs.existsSync(path.join(localPath, '.gitignore'))) {
        print.errorLog(`${localPath} 路径下不存在 .gitignore 文件`)
        return
    }
    // 3、更新 .gitignore
    // 步骤：清除缓存、重新添加、提交、推送
    shell.exec('git rm -r --cached .')
    shell.exec('git add .gitignore')
    shell.exec('git add *')
    shell.exec(`git commit -m "update .gitignore"`)
    shell.exec('git push -u origin master')
}